﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;
using System.Data.SqlClient;

namespace CapaDatos.Adapters
{
   public class GastoAdapter
    {

       BDRinconLuzEntities contexto;

       public GastoAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

       public GastoAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }

        public void Agregar(Gasto entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && entidad.ChangeTracker.State == ObjectState.Added)
            {
                contexto.RegistrarCambios(entidad);
                contexto.RealizarCambios();
            }
        }

        public void Eliminar(Gasto entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            IObjectSet<Gasto> objectSet = contexto.CrearSet<Gasto>();

            objectSet.Attach(entidad);
            objectSet.DeleteObject(entidad);
        }



        public void Modificar(Gasto entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && (entidad.ChangeTracker.State & ObjectState.Deleted) != ObjectState.Deleted)
            {
                entidad.MarkAsModified();
            }

            contexto.SaveChanges();
        }


        public IEnumerable<Gasto> Obtener()
        {
            return contexto.CrearSet<Gasto>();
        }

       
        
        public Gasto ObtenerEntidad(Guid id)
        {

            var Entidad = (from v in contexto.Gasto.Include("CategoriaGasto")
                           where v.IdGasto == id &&
                                    v.Eliminado != true
                           select v).First();
            return Entidad;

        }



        public List<ViewEntity> ObtenerGastosPorMesAño(string mes, int año)
        {

            int mesGasto = this.ObtenerNumeroMes(mes);

            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var Existe = (from v in contexto.Gasto
                          where v.FechaPago.Month == mesGasto &&
                          v.FechaPago.Year == año &&
                          v.Eliminado != true
                          select v).Any();

            if (Existe)
            {
                var Lista = (from v in contexto.Gasto.Include("CategoriaGasto")
                             where v.FechaPago.Month == mesGasto &&
                               v.FechaPago.Year == año &&
                               v.Eliminado != true
                             select v).ToList();

                if (Lista.Count > 0)
                {

                    foreach (var item in Lista)
                    {
                        ListaFinal.Add(new ViewEntity(item.IdGasto, item.CategoriaGasto.NombreCategoriaGasto));
                    }

                }
            }

            return ListaFinal;
        }



        public bool ExisteGasto(Guid idCategoria, int mes, int año)
        {

            var ExisteEntidad = (from v in contexto.Gasto
                                 where v.IdCategoriaGasto == idCategoria &&
                                        v.FechaPago.Month == mes &&
                                        v.FechaPago.Year == año &&
                             v.Eliminado != true
                                 select v).Any();

            return ExisteEntidad;

        }
       

        internal int ObtenerNumeroMes(string mes)
        {

            switch(mes)
            {

                case "Enero":
                    return 1;

                case "Febrero":
                    return 2;

                case "Marzo":
                    return 3;
                
                case "Abril":
                    return 4;

                case "Mayo":
                    return 5;

                case "Junio":
                    return 6;

                case "Julio":
                    return 7;

                case "Agosto":
                    return 8;

                case "Septiembre":
                    return 9;

                case "Octubre":
                    return 10;

                case "Noviembre":
                    return 11;

                case "Diciembre":
                    return 12;

                default: return 0;

            }


        }











    }
}
